package notify

import (
	"time"
)

// ==================== 通知参数 ====================

// NotifyParam 通知参数
type NotifyParam struct {
	// Method 请求方法
	Method string `json:"method,omitempty"`
	// URI 请求URI
	URI string `json:"uri,omitempty"`
	// Alg 算法类型
	Alg string `json:"alg,omitempty"`
	// Sign 签名
	Sign string `json:"sign,omitempty"`
	// Nonce 随机数
	Nonce string `json:"nonce,omitempty"`
	// Timestamp 时间戳
	Timestamp string `json:"timestamp,omitempty"`
	// Body 请求体
	Body string `json:"body,omitempty"`
}

// NewNotifyParam 创建通知参数
func NewNotifyParam() *NotifyParam {
	return &NotifyParam{}
}

// ToMap 转换为map
func (n *NotifyParam) ToMap() map[string]interface{} {
	result := make(map[string]interface{})

	if n.Method != "" {
		result["method"] = n.Method
	}
	if n.URI != "" {
		result["uri"] = n.URI
	}
	if n.Alg != "" {
		result["alg"] = n.Alg
	}
	if n.Sign != "" {
		result["sign"] = n.Sign
	}
	if n.Nonce != "" {
		result["nonce"] = n.Nonce
	}
	if n.Timestamp != "" {
		result["timestamp"] = n.Timestamp
	}
	if n.Body != "" {
		result["body"] = n.Body
	}

	return result
}

// ==================== 审核详情 ====================

// AuditDetail 审核详情
type AuditDetail struct {
	// FieldName 字段名称
	FieldName string `json:"field_name,omitempty"`
	// FieldValue 字段值
	FieldValue string `json:"field_value,omitempty"`
	// ErrorMsg 错误信息
	ErrorMsg string `json:"error_msg,omitempty"`
}

// NewAuditDetail 创建审核详情
func NewAuditDetail() *AuditDetail {
	return &AuditDetail{}
}

// ToMap 转换为map
func (a *AuditDetail) ToMap() map[string]interface{} {
	result := make(map[string]interface{})

	if a.FieldName != "" {
		result["field_name"] = a.FieldName
	}
	if a.FieldValue != "" {
		result["field_value"] = a.FieldValue
	}
	if a.ErrorMsg != "" {
		result["error_msg"] = a.ErrorMsg
	}

	return result
}

// ==================== 申请结果记录 ====================

// ApplyResultRecord 申请结果记录
type ApplyResultRecord struct {
	// ApplyID 业务申请编号
	ApplyID string `json:"apply_id,omitempty"`
	// AppID 机构号
	AppID string `json:"app_id,omitempty"`
	// AuditStatus 审核状态 01：审核通过, 02：审核中， 09：审核驳回
	AuditStatus string `json:"audit_status,omitempty"`
	// AuditDetail 审核驳回详情
	AuditDetail []*AuditDetail `json:"audit_detail,omitempty"`
	// AuditFailure 审核驳回描述
	AuditFailure string `json:"audit_failure,omitempty"`
	// MerchNo 商户号
	MerchNo string `json:"merch_no,omitempty"`
	// SignID 协议编号
	SignID string `json:"sign_id,omitempty"`
	// DelegationSignID 委托合同协议编号
	DelegationSignID string `json:"delegation_sign_id,omitempty"`
	// AcquiringSignID 收单合同协议编号
	AcquiringSignID string `json:"acquiring_sign_id,omitempty"`
	// SignStatus 签约状态 00:未签约 01:已签约 02:签约中 09:签约失败
	SignStatus string `json:"sign_status,omitempty"`
	// SignDelegateeStatus 授权收款模式下，被授权人的签约状态
	SignDelegateeStatus string `json:"sign_delegatee_status,omitempty"`
	// SignDelegateeURL 授权收款模式下，被授权人的承诺函、电子协议签约链接
	SignDelegateeURL string `json:"sign_delegatee_url,omitempty"`
	// SignURL 协议链接
	SignURL string `json:"sign_url,omitempty"`
	// TermNo 终端号
	TermNo string `json:"term_no,omitempty"`
	// AuditEndTime 审核时间
	AuditEndTime *time.Time `json:"audit_end_time,omitempty"`
	// SubAppidBindRet appid绑定结果 01: 成功 02: 处理中 09: 失败
	SubAppidBindRet string `json:"sub_appid_bind_ret,omitempty"`
	// SubAppidBindMsg 绑定结果描述
	SubAppidBindMsg string `json:"sub_appid_bind_msg,omitempty"`
	// WechatJsapiPathRet 支付目录绑定结果 01: 成功 02: 处理中 09: 失败
	WechatJsapiPathRet string `json:"wechat_jsapi_path_ret,omitempty"`
	// WechatJsapiPathMsg 支付目录绑定结果描述
	WechatJsapiPathMsg string `json:"wechat_jsapi_path_msg,omitempty"`
	// CoopBankRet 入驻银行合作平台 01: 成功 02: 处理中 09: 失败
	CoopBankRet string `json:"coop_bank_ret,omitempty"`
	// CoopBankMsg 入驻结果描述
	CoopBankMsg string `json:"coop_bank_msg,omitempty"`
}

// NewApplyResultRecord 创建申请结果记录
func NewApplyResultRecord() *ApplyResultRecord {
	return &ApplyResultRecord{
		AuditDetail: make([]*AuditDetail, 0),
	}
}

// ToMap 转换为map
func (a *ApplyResultRecord) ToMap() map[string]interface{} {
	result := make(map[string]interface{})

	if a.ApplyID != "" {
		result["apply_id"] = a.ApplyID
	}
	if a.AppID != "" {
		result["app_id"] = a.AppID
	}
	if a.AuditStatus != "" {
		result["audit_status"] = a.AuditStatus
	}
	if a.AuditDetail != nil && len(a.AuditDetail) > 0 {
		auditDetails := make([]map[string]interface{}, 0)
		for _, detail := range a.AuditDetail {
			auditDetails = append(auditDetails, detail.ToMap())
		}
		result["audit_detail"] = auditDetails
	}
	if a.AuditFailure != "" {
		result["audit_failure"] = a.AuditFailure
	}
	if a.MerchNo != "" {
		result["merch_no"] = a.MerchNo
	}
	if a.SignID != "" {
		result["sign_id"] = a.SignID
	}
	if a.DelegationSignID != "" {
		result["delegation_sign_id"] = a.DelegationSignID
	}
	if a.AcquiringSignID != "" {
		result["acquiring_sign_id"] = a.AcquiringSignID
	}
	if a.SignStatus != "" {
		result["sign_status"] = a.SignStatus
	}
	if a.SignDelegateeStatus != "" {
		result["sign_delegatee_status"] = a.SignDelegateeStatus
	}
	if a.SignDelegateeURL != "" {
		result["sign_delegatee_url"] = a.SignDelegateeURL
	}
	if a.SignURL != "" {
		result["sign_url"] = a.SignURL
	}
	if a.TermNo != "" {
		result["term_no"] = a.TermNo
	}
	if a.AuditEndTime != nil {
		result["audit_end_time"] = a.AuditEndTime.Format("2006-01-02 15:04:05")
	}
	if a.SubAppidBindRet != "" {
		result["sub_appid_bind_ret"] = a.SubAppidBindRet
	}
	if a.SubAppidBindMsg != "" {
		result["sub_appid_bind_msg"] = a.SubAppidBindMsg
	}
	if a.WechatJsapiPathRet != "" {
		result["wechat_jsapi_path_ret"] = a.WechatJsapiPathRet
	}
	if a.WechatJsapiPathMsg != "" {
		result["wechat_jsapi_path_msg"] = a.WechatJsapiPathMsg
	}
	if a.CoopBankRet != "" {
		result["coop_bank_ret"] = a.CoopBankRet
	}
	if a.CoopBankMsg != "" {
		result["coop_bank_msg"] = a.CoopBankMsg
	}

	return result
}
